
/**
 * 
 * @param {String} key 要获取参数的名称 
 * @returns 
 */
// getUrlParam拿到登录的用户Id
function getUrlParam(key) {
    var result;
    // 截取字符串
    // location: window的location对象
    // search: 得到的是url中的query部分
    // subsur(): 返回一个从指定位置开始的指定长度的子字符串;这里设置为1，是为了把url中的?号去掉
    //split() :split("")把字符串切割成数组，这里就是把query部分以&为分割符，分割
    location.search.substr(1).split('&').forEach(function (item) {
        // console.log(item)
        var keyValue = item.split('=');
        // console.log(keyValue);
        // console.log(keyValue[0]);
        if (keyValue[0] == key) {
            result = keyValue[1];
        }
    })
    return result;
}

// 处理时间的函数format,time形参，对应的是php接口中的时间id
function format(time) {
    let d = new Date();
    d.setTime(time * 1000);//ajax中的毫秒转为秒
    return d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate();
}
/**
 * 发送Ajax请求
 * @param {Object} options 发送请求参数
 */
// 封装Ajax
function ajax(options) {
    // 1、默认配置信息  逗号隔开
    let config = {
        url: '',//表示请求地址
        type: 'get',//表示请求方式
        data: '',//表示请求额外携带的参数 可以是字符串类型 也可以是对象类型
        contentType: 'application/x-www-form-urlencoded',//表示设置请求头content-type对应的值,//表示常规的表单格式 也就是key、value的键值对格式 名称=值&名称=值
        dataType: 'json',//表示服务端默认返回的数据 格式
        success: function () { }//表示拿到服务度结果之后的处理方式，是一个回调函数
    }
    // 2、默认配置的合并
    for (let key in config) {
        // 检查 options中是否有传递对应key值的属性，如果存在 就覆盖
        options[key] && (config[key] = options[key]);
        // console.log(key);
        // console.log(options[key]);
    }

    // 3、检查每一个参数是否满足要求
    // 3.1、验证url 考虑可能存在前端与后端在同一个目录下 可以省略http之类的。所以url只限制必须传递
    if (!config.url) {
        throw new Error('url必须传递!');
    }
    // 3.2、验证请求方式  
    // 存储容许的请求方式 
    let allowType = ['get', 'post', 'put', 'delete'];
    // 将请求方式转换为小写
    config.type = config.type.toLowerCase();
    if (!allowType.includes(config.type)) {
        throw new Error('请求方式设置错误');
    }
    // 3.3、验证请求数据 要求请求数据格式只能是字符串或者对象Object.prototype.toString.call(config.data)
    let dataType = Object.prototype.toString.call(config.data);
    // console.log(config.data);
    if (dataType != '[object String]' && dataType != '[object Object]') {
        throw new Error('请求数据格式错误');
    }
    // 3.4、验证回调 要求必须是函数
    if (Object.prototype.toString.call(config.success) != '[object Function]') {
        // console.log(config.success);
        throw new Error('回调必须是一个函数');
    }
    // 4、构建请求携带的数据 config.data 可能是字符串 也可能是对象，如果是字符串 什么事情都不做处理,如果是对象则需要将对象转换为字符串
    let data = '';//保存请求携带的数据
    if (Object.prototype.toString.call(config.data) == '[object String]') {
        data = config.data;
        // console.log(data);
    } else {
        // 如果是get，delete请求 字符串最终需要放到URL地址上 格式 key/value格式，如果是post，put请求 格式有可能是key/value格式 也可能JSON格式
        if ((config.type == 'post' || config.type == 'put') && config.contentType == 'application/json') {
            // 设置请求参数为JSON格式
            data = JSON.stringify(config.data);
        } else {
            for (let key in config.data) {
                data += `${key}=${config.data[key]}&`
            }
            // 截取最后多的一个&
            data = data.substr(0, data.length - 1);
        }
    }
    // 5、获取Ajax对象
    let xhr = new XMLHttpRequest;
    // 6、打开连接
    //保存请求的地址
    let url = config.url;
    if ((config.type == 'get' || config.type == 'delete') && data) {
        url = config.url + '?' + data;
    }
    xhr.open(config.type, url);
    // 设置请求头信息
    xhr.setRequestHeader('Content-Type', config.contentType);
    // 7、发送请求
    // 判断请求方式为post或者put 并且data中有参数需要携带 所以才使用data 否则 就传递空
    xhr.send(((config.type == 'post' || config.type == 'put') && data) ? data : '');
    // 8、监听状态改变
    xhr.onreadystatechange = function () {
        if (xhr.status == 200 && xhr.readyState == 4) {
            // 如果服务端返回的数据格式是JSON格式的字符串 就转换为对象
            let response = (config.dataType == 'json') ? JSON.parse(xhr.responseText) : xhr.responseText;
            // 使用回调函数处理结果
            config.success(response)

        }
    }
}



/**
 * 设置cookie
 * @param {String} key cookie的名称
 * @param {String} value  cookie的值
 * @param {Number} expires 传递过期时间，单位为秒  默认值0表示关闭浏览器失效
 */
function setCookie(key, value, expires = 0) {
    if (expires == 0) {
        document.cookie = `${key}=${value};path=/`;
    } else {
        let d = new Date();
        d.setTime(d.getTime() - 8 * 3600 * 1000 + expires * 1000);
        document.cookie = `${key}=${value};path=/;expires=${d}`;
    }
}
/**
 * 删除cookie
 * @param {String} key cookie的名称
 */
function removeCookie(key) {
    setCookie(key, '', -1);
}

/**
 * 获取cookie的值
 * @param {String} key cookie的名称 
 */
function getCookie(key) {
    let value = '';
    document.cookie.split('; ').forEach(item => {
        let keyVlue = item.split('=')
        if (key == keyVlue[0]) {
            value = keyVlue[1];
        }
    })
    return value;
}